A partir dos dados disponibilizados … é possivel aplicar diferentes abordagens nesses dados…
Problema para prever o salário de um cientista de dados
Y = salário de um cientista de dados
Leitura dos dados e arrumar nomes de colunas
# read dataset
dataset <- read_csv("datahackers-survey-2019-anonymous-responses.csv")
# fix colnames
dataset <-
dataset %>%
janitor::clean_names()
Algumas restrições impostas aos dados:
Conferir quantidade de opcoes de resposta por pergunta que tenha mais de uma resposta (ordenado do maior para o menor):
(
MORE_QUESTIONS <-
dataset %>%
colnames() %>%
str_extract("(p|d)[0-9]{1,}") %>%
table() %>%
.[.>1] %>%
sort(decreasing = T)
)
## .
## p26 p20 p27 p21 p28 p33 p30 p34 p23 p24 p25 p31 p35
## 24 21 16 13 12 11 10 10 7 7 7 6 2
Tabela de perguntas de múltipla seleçãom com maior quantidade de respostas:
dataset %>%
select(str_which(colnames(dataset), paste0(names(MORE_QUESTIONS), collapse = "|"))) %>%
select_if(is.numeric) %>%
map_df(sum) %>%
gather() %>%
arrange(-value) %>%
separate(key, c("pergunta", "resposta"), "_", extra = "merge") %>%
kable2(width = NULL)
| pergunta | resposta | value |
|---|---|---|
| p31 | data_hackers_blog | 1195 |
| p34 | udemy | 1125 |
| p31 | data_hackers_podcast | 1096 |
| p33 | youtube_channels | 1014 |
| p31 | weekly_newsletter | 878 |
| p23 | sql | 834 |
| p21 | python | 784 |
| p33 | abroad_blogs | 780 |
| p33 | meetups_and_events | 762 |
| p23 | sheets | 758 |
| p31 | slack_channel | 728 |
| p21 | sql | 714 |
| p34 | coursera | 693 |
| p24 | sql | 681 |
| p33 | other_brasilian_blogs | 675 |
| p34 | udacity | 527 |
| p20 | linear_regression | 524 |
| p33 | telegram_groups | 476 |
| p33 | abroad_podcasts | 452 |
| p20 | decision_tree | 441 |
| p25 | aws | 412 |
| p20 | logistic_regression | 406 |
| p27 | microsoft_powerbi | 393 |
| p34 | data_camp | 392 |
| p33 | whatsapp_groups | 385 |
| p24 | planilhas | 384 |
| p23 | nosql | 377 |
| p20 | cluster_analysis | 368 |
| p26 | mysql | 366 |
| p20 | random_forest | 359 |
| p26 | postgresql | 345 |
| p33 | 341 | |
| p26 | sql_server | 334 |
| p23 | nlp | 330 |
| p21 | r | 318 |
| p34 | kaggle_learn | 316 |
| p34 | height | 301 |
| p34 | edx | 294 |
| p28 | sql_stored_procedures | 293 |
| p31 | do_not_know_data_hackers | 275 |
| p20 | neural_networks | 267 |
| p20 | nlp | 252 |
| p34 | other | 238 |
| p25 | gcp | 225 |
| p20 | bayesian_inference | 224 |
| p26 | oracle | 221 |
| p27 | tableau | 209 |
| p26 | mongodb | 207 |
| p28 | other | 205 |
| p20 | no_listed_methods | 192 |
| p25 | azure | 191 |
| p26 | s3 | 189 |
| p20 | svms | 180 |
| p27 | no_bi_tool_at_work | 179 |
| p20 | gradient_boosted_machines | 177 |
| p28 | pentaho | 170 |
| p20 | ensemble | 169 |
| p34 | online_courses | 168 |
| p33 | other | 166 |
| p25 | cloud_propria | 163 |
| p23 | images | 160 |
| p28 | apache_airflow | 156 |
| p25 | on_premise_servers | 152 |
| p27 | metabase | 144 |
| p33 | only_data_hackers | 138 |
| p24 | nosql | 136 |
| p20 | glms | 134 |
| p27 | google_data_studio | 129 |
| p28 | siss_sql_server_integration_services | 126 |
| p26 | elaticsearch | 115 |
| p30 | postgres_mysql | 107 |
| p27 | only_excel_gsheets | 105 |
| p28 | aws_glue | 104 |
| p26 | sqlite | 102 |
| p20 | cnns | 101 |
| p20 | longitudinal_data_analysis | 101 |
| p20 | rnns | 98 |
| p27 | qlik_view_qlik_sense | 95 |
| p26 | other | 94 |
| p33 | other_slack_channels | 93 |
| p30 | aws_redshift | 92 |
| p21 | java | 89 |
| p30 | microsoft_azure | 85 |
| p21 | visual_basic_vba | 84 |
| p24 | nlp | 84 |
| p27 | other | 83 |
| p30 | oracle | 82 |
| p20 | markov_chains | 79 |
| p20 | joint_analysis | 79 |
| p20 | survival_analysis | 72 |
| p25 | other | 69 |
| p31 | data_hackers_bootcamp | 68 |
| p21 | c_c_c_number | 65 |
| p26 | mariadb | 64 |
| p34 | data_quest | 64 |
| p21 | scala | 62 |
| p21 | sas_stata | 61 |
| p30 | do_not_know | 60 |
| p30 | google_bigquery | 54 |
| p21 | php | 48 |
| p25 | ibm | 44 |
| p26 | redis | 44 |
| p28 | talend | 42 |
| p26 | dynamodb | 41 |
| p26 | firebase | 40 |
| p26 | db2 | 39 |
| p28 | ibm_data_stage | 39 |
| p28 | alteryx | 37 |
| p28 | oracle_data_integrator | 37 |
| p23 | videos | 36 |
| p26 | google_bigtable | 36 |
| p30 | other | 36 |
| p21 | dotnet | 35 |
| p23 | other | 35 |
| p26 | ms_access | 34 |
| p26 | hbase | 33 |
| p21 | matlab | 29 |
| p30 | teradata | 28 |
| p26 | cassandra | 27 |
| p27 | microstrategy | 27 |
| p27 | redash | 26 |
| p20 | gans | 24 |
| p28 | sap_bw_etl | 24 |
| p26 | aurora | 23 |
| p24 | imagens | 22 |
| p26 | neo4j | 21 |
| p27 | ibm_analytics_cognos | 20 |
| p30 | ibm | 20 |
| p20 | hmms | 18 |
| p26 | sybase | 18 |
| p27 | superset | 17 |
| p27 | sap_business_objects | 17 |
| p27 | looker | 15 |
| p28 | luigi | 15 |
| p21 | julia | 14 |
| p30 | snowflake | 14 |
| p24 | other | 10 |
| p27 | oracle_business_intelligence | 10 |
| p21 | no_listed_languages | 8 |
| p24 | videos | 5 |
| p26 | coachdb | 5 |
| p26 | vertica | 5 |
| p26 | datomic | 3 |
| p27 | birst | 2 |
A definição de cada atributo pode ser conferida com mais detalhes em: https://www.kaggle.com/datahackers/pesquisa-data-hackers-2019
Como o objetivo deste kernel é criar um modelo que calcule o salário de um cientista de dados de acordo com suas respostas na pesquisa, será realizada uma pré-seleção de atributos para previsão de salário, pois, não desejamos que o modelo faça distinção de salário por algumas razões como idade e genero.
| Indice | Pergunda | Seleção |
|---|---|---|
| P1 | Idade? [Mascarada] | ✗ |
| P2 | Gênero? [Mascarada] | ✗ |
| P3 | Atualmente você vive no Brasil? | ✗ |
| P4 | Em que país você vive hoje? | ✗ |
| P5 | Em que estado você vive hoje? [Mascarada] | ✗ |
| P6 | Na questão anterior você disse que vive em. Esse é seu estado de origem (onde nasceu ou se formou)? | ✗ |
| P7 | Qual seu estado de origem? | ✗ |
| P8 | Qual seu nível de ensino? | ✔ |
| P9 | Qual sua área de formação? | ✔ |
| P10 | Qual sua situação atual de trabalho? | ✗ |
| P11 | A empresa em que você trabalha pertence a qual setor? | ✔ |
| P12 | A empresa em que você trabalha possui quantos funcionários atualmente? | ✔ |
| P13 | Você atua como gestor? | ✔ |
| P14 | Qual das opções abaixo definem melhor seu cargo de trabalho atual como gestor? | ✔ |
| P15 | Qual das opções abaixo definem melhor seu cargo de trabalho atual? | ✔ |
| P16 | Qual sua faixa salarial atual? [Mascarada] | ✔ |
| P17 | Quanto tempo de experiência na área de dados você tem? | ✔ |
| P18 | Quanto tempo de experiência na área de TI/Engenharia de Software você teve antes de começar a trabalhar na área de dados? | ✔ |
| P19 | Você se considera um profissional que atua na área de Data Science? | ✔ |
| P20 | Quais dos métodos listados abaixo você costuma utilizar no trabalho? | ✔ |
| P21 | Quais das linguagens de programação listadas abaixo você utiliza no trabalho? | ✔ |
| P22 | Entre as linguagens de programação listadas abaixo, qual é a que você mais utiliza no trabalho? [Mascarada] | ✔ |
| P23 | Quais das fontes de dados listadas você já analisou no trabalho? | ✔ |
| P24 | Entre as fontes de dados listadas, quais você utiliza na maior parte do tempo? Selecione no máximo duas opções que você mais utiliza. | ✔ |
| P25 | Quais das opções de Cloud listadas abaixo você utiliza no trabalho? | ✔ |
| P26 | Quais dos bancos de dados/fontes de dados listados abaixo você utiliza para consultar informações, e posteriormente analisar, no trabalho? | ✔ |
| P27 | Quais as Ferramentas de Business Intelligence você utiliza no trabalho? | ✔ |
| P28 | Quais as tecnologias são utilizadas como ferramenta de ETL no seu trabalho? | ✔ |
| P29 | Sua organização possui um Data Warehouse? | ✔ |
| P30 | Qual tecnologia utilizada como plataforma do Data Warehouse? | ✔ |
| P31 | Quais das iniciativas do Data Hackers que você já acessou/acompanhou? | ✗ |
| P32 | Entre as iniciativas do Data Hackers qual a sua preferida? | ✗ |
| P33 | De quais outras formas que você costuma se atualizar no mundo dos dados? | ✔ |
| P34 | Em quais dessas plataformas listadas abaixo você já iniciou/completou cursos na área de Data Science? | ✔ |
| P35 | Dentre as plataformas listadas abaixo qual foi a sua preferida para cursos de Data Science? | ✗ |
Além dessas, mais algumas outras colunas:
| Indice | Pergunda | Seleção |
|---|---|---|
| D1 | Macrorregião em que mora | ✗ |
| D2 | Macrorregião em que nasceu | ✗ |
| D3 | Área de formação anonimizada | ✔ |
| D4 | Setor de mercado anonimizado | ✔ |
| D5 | Nível de gerência anonimizado | ✔ |
| D6 | Cargo anonimizado | ✔ |
Primeiramente, vamos conferir quem sao os individuos que nao declararam o salario:
dataset %>%
count(p10_job_situation, p16_salary_range) %>%
filter(is.na(p16_salary_range)) %>%
kable2(width = NULL)
| p10_job_situation | p16_salary_range | n |
|---|---|---|
| Desempregado e não estou buscando recolocação | NA | 3 |
| Desempregado, buscando recolocação | NA | 69 |
| Somente Estudante (graduação) | NA | 85 |
| Somente Estudante (pós-graduação) | NA | 36 |
| Trabalho na área Acadêmica/Pesquisador | NA | 45 |
Como não são pessoas que estão no mercado de trabalho, não utilizaremos estes registros para o treinamento do modelo
dataset <-
dataset %>%
filter(p3_living_in_brasil == 1) %>%
filter(!is.na(p16_salary_range)) %>%
select(-p3_living_in_brasil)
Aplicando os filtros:
dataset <-
dataset %>%
select(p8_degreee_level,
p12_workers_number:p30_teradata,
p33_telegram_groups:p34_other,
d3_anonymized_degree_area:d6_anonymized_role)
# before fix y
p1 <-
plotly::ggplotly(
dataset %>%
count(p16_salary_range) %>%
ggplot(aes(x= p16_salary_range, y = n))+
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust = 1))
)
# Agregar salarios com menor frequencia
dataset <-
dataset %>%
mutate(p16_salary_range = as.character(p16_salary_range),
p16_salary_range =
case_when(
p16_salary_range == "Menos de R$ 1.000/mês" ~ "Menos de R$ 2.000/mês",
p16_salary_range == "de R$ 1.001/mês a R$ 2.000/mês" ~ "Menos de R$ 2.000/mês",
p16_salary_range == "de R$ 2.001/mês a R$ 3000/mês" ~ "de R$ 2.001/mês a R$ 3.000/mês",
p16_salary_range == "de R$ 12.001/mês a R$ 16.000/mês" ~ "Acima de R$ 12.001/mês",
p16_salary_range == "de R$ 16.001/mês a R$ 20.000/mês" ~ "Acima de R$ 12.001/mês",
p16_salary_range == "de R$ 20.001/mês a R$ 25.000/mês" ~ "Acima de R$ 12.001/mês",
p16_salary_range == "Acima de R$ 25.001/mês" ~ "Acima de R$ 12.001/mês",
TRUE ~ as.character(p16_salary_range)),
p16_salary_range =
factor(p16_salary_range,
levels = c("Menos de R$ 2.000/mês",
"de R$ 2.001/mês a R$ 3.000/mês",
"de R$ 3.001/mês a R$ 4.000/mês",
"de R$ 4.001/mês a R$ 6.000/mês",
"de R$ 6.001/mês a R$ 8.000/mês",
"de R$ 8.001/mês a R$ 12.000/mês",
"Acima de R$ 12.001/mês")))
# after fix y
p2 <-
plotly::ggplotly(
dataset %>%
count(p16_salary_range) %>%
ggplot(aes(x= p16_salary_range, y = n))+
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust = 1))
)
plotly::subplot(p1, p2)
Uma primeira impressão dos dados pode ser obtida com o pacote DataExplorer:
create_report(dataset, y = "p16_salary_range")
Algumas informações sobre os dados:
introduce(dataset) %>% gather() %>% kable2()
| key | value |
|---|---|
| rows | 1506 |
| columns | 148 |
| discrete_columns | 10 |
| continuous_columns | 138 |
| all_missing_columns | 0 |
| total_missing_values | 3060 |
| complete_rows | 9 |
| total_observations | 222888 |
| memory_usage | 1816968 |
De forma visual:
plot_intro(dataset)
Na verdade a maioria de colunas do tipo Continuous ocorre porque as respostas de múltiplas escolhas foram transformadas em dummie
Formato e limpeza
Representação da estrutura dos dados:
visdat::vis_dat(dataset)
Colunas com dados ausentes:
plot_missing(dataset, missing_only = T)
A ação executada para os registros de NA será remover colunas p29_have_data_warehouse, p22_most_used_proggraming_languages,d5_anonymized_manager_level, d6_anonymized_role, d4_anonymized_market_sector e d3_anonymized_degree_area inteiras. Vamos supor que não sejam importante no ajuste desse modelo.
Além disso vamos remover todas as linhas restantes com NA e avaliar o impacto no tamanho do dataset:
nlim_antes <- nrow(dataset)
dataset <-
dataset %>%
select(-p29_have_data_warehouse,
-p22_most_used_proggraming_languages,
-d5_anonymized_manager_level,
-d6_anonymized_role,
-d4_anonymized_market_sector,
-d3_anonymized_degree_area) %>%
na.omit()
Uma diminuição de apenas 100% no numero de linhas do dataset
ncol_antes <- ncol(dataset)
n_zeros <- dataset %>% map_dbl(~sum(.x == 0)/ nrow(dataset))
n_zeros <- names(n_zeros[n_zeros > 0.9])
col_zeros <- n_zeros %>% str_extract("(p|d)[0-9]{1,}") %>% unique()
col_zeros <- colnames(dataset)[colnames(dataset) %>% str_which(paste0(col_zeros, collapse = "|"))]
dataset$p20_datascience <- dataset %>% select(starts_with("p20")) %>% apply(1, sum)
dataset$p21_prog_language <- dataset %>% select(starts_with("p21")) %>% apply(1, sum)
dataset$p25_cloud <- dataset %>% select(starts_with("p25")) %>% apply(1, sum)
dataset$p26_databases <- dataset %>% select(starts_with("p26")) %>% apply(1, sum)
dataset$p27_bi <- dataset %>% select(starts_with("p27")) %>% apply(1, sum)
dataset$p28_etl <- dataset %>% select(starts_with("p28")) %>% apply(1, sum)
dataset$p33_comunity <- dataset %>% select(starts_with("p33")) %>% apply(1, function(x){ifelse(sum(x)!=0, 1, 0)})
dataset$p34_extra_study <- dataset %>% select(starts_with("p34")) %>% apply(1, sum)
dataset <-
dataset %>%
select(-one_of(colnames(dataset)[str_which(colnames(dataset), paste0(col_zeros, collapse = "|"))]))
Uma diminuição de 127 colunas do dataset
dataset <-
dataset %>%
mutate(p8_degreee_level=
case_when(p8_degreee_level == "Estudante de Graduação" ~ 1,
p8_degreee_level == "Graduação/Bacharelado" ~ 2,
p8_degreee_level == "Pós-graduação" ~ 3,
p8_degreee_level == "Mestrado" ~ 3,
p8_degreee_level == "Doutorado ou Phd" ~ 4,
),
p12_workers_number =
case_when(p12_workers_number == "de 1 a 5" ~ 1,
p12_workers_number == "de 6 a 10" ~ 2,
p12_workers_number == "de 11 a 50" ~ 3,
p12_workers_number == "de 51 a 100" ~ 4,
p12_workers_number == "de 101 a 500" ~ 5,
p12_workers_number == "de 501 a 1000" ~ 6,
p12_workers_number == "de 1001 a 3000" ~ 7,
p12_workers_number == "Acima de 3000" ~ 8),
p17_time_experience_data_science =
case_when(str_detect(p17_time_experience_data_science, "Não")~0,
p17_time_experience_data_science == "Menos de 1 ano" ~ 1,
p17_time_experience_data_science == "de 1 a 2 anos" ~ 2,
p17_time_experience_data_science == "de 2 a 3 anos" ~ 3,
p17_time_experience_data_science == "de 4 a 5 anos" ~ 4,
p17_time_experience_data_science == "de 6 a 10 anos" ~ 5,
p17_time_experience_data_science == "Mais de 10 anos" ~ 6),
p18_time_experience_before =
case_when(str_detect(p18_time_experience_before, "Não")~0,
p18_time_experience_before== "Menos de 1 ano"~1,
p18_time_experience_before== "de 1 a 2 anos"~2,
p18_time_experience_before== "de 2 a 3 anos"~3,
p18_time_experience_before== "de 4 a 5 anos"~4,
p18_time_experience_before== "de 6 a 10 anos"~5,
p18_time_experience_before== "Mais de 10 anos"~6),
p16_salary_range = as.numeric(p16_salary_range)
) %>%
select(p16_salary_range, everything())
dataset %>%
select_if(is.numeric) %>%
GGally::ggpairs(upper = list(continuous = GGally::wrap("cor", method = "spearman")))
m0 <- lm(p16_salary_range ~.,data = dataset)
summary(m0)
##
## Call:
## lm(formula = p16_salary_range ~ ., data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.9456 -0.9115 -0.0234 0.9373 4.4402
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.07285 0.79132 0.092 0.9267
## p8_degreee_level 0.77964 0.04857 16.051 < 2e-16 ***
## p12_workers_number 0.15633 0.01744 8.964 < 2e-16 ***
## p13_manager 0.85121 0.09485 8.974 < 2e-16 ***
## p17_time_experience_data_science 0.27748 0.02186 12.691 < 2e-16 ***
## p18_time_experience_before 0.16030 0.01743 9.196 < 2e-16 ***
## p19_is_data_science_professional -0.16658 0.17302 -0.963 0.3358
## p20_datascience 0.06909 0.01398 4.941 8.68e-07 ***
## p21_prog_language -0.10128 0.04669 -2.169 0.0302 *
## p25_cloud 0.04085 0.07606 0.537 0.5914
## p26_databases 0.04329 0.03078 1.407 0.1598
## p27_bi 0.04770 0.05673 0.841 0.4006
## p28_etl 0.07304 0.06939 1.053 0.2927
## p33_comunity -0.22405 0.78167 -0.287 0.7744
## p34_extra_study 0.03951 0.02616 1.510 0.1312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.347 on 1459 degrees of freedom
## (32 observations deleted due to missingness)
## Multiple R-squared: 0.4918, Adjusted R-squared: 0.4869
## F-statistic: 100.8 on 14 and 1459 DF, p-value: < 2.2e-16
autoplot(m0, which = 1:6)
Remover observacoes com alta alavacagem:
to_remove <- c(878, 204, 1309)
dataset <- dataset[-to_remove, ]
Ajustar modelo novamente utilizando stepwise para seleção de atributos:
m1 <- lm(p16_salary_range ~.,data = dataset) %>% step()
## Start: AIC=872.68
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p19_is_data_science_professional + p20_datascience + p21_prog_language +
## p25_cloud + p26_databases + p27_bi + p28_etl + p33_comunity +
## p34_extra_study
##
## Df Sum of Sq RSS AIC
## - p33_comunity 1 0.20 2608.8 870.79
## - p27_bi 1 0.88 2609.5 871.18
## - p25_cloud 1 0.92 2609.5 871.20
## - p28_etl 1 1.53 2610.1 871.54
## - p19_is_data_science_professional 1 2.11 2610.7 871.87
## - p26_databases 1 2.81 2611.4 872.26
## - p34_extra_study 1 3.54 2612.1 872.67
## <none> 2608.6 872.68
## - p21_prog_language 1 6.24 2614.8 874.20
## - p20_datascience 1 48.06 2656.6 897.54
## - p12_workers_number 1 146.81 2755.4 951.22
## - p13_manager 1 150.28 2758.8 953.07
## - p18_time_experience_before 1 160.43 2769.0 958.48
## - p17_time_experience_data_science 1 298.64 2907.2 1030.12
## - p8_degreee_level 1 462.63 3071.2 1110.84
##
## Step: AIC=870.79
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p19_is_data_science_professional + p20_datascience + p21_prog_language +
## p25_cloud + p26_databases + p27_bi + p28_etl + p34_extra_study
##
## Df Sum of Sq RSS AIC
## - p25_cloud 1 0.84 2609.6 869.26
## - p27_bi 1 0.87 2609.6 869.28
## - p28_etl 1 1.56 2610.3 869.67
## - p19_is_data_science_professional 1 2.09 2610.9 869.97
## - p26_databases 1 2.89 2611.7 870.42
## <none> 2608.8 870.79
## - p34_extra_study 1 3.59 2612.4 870.81
## - p21_prog_language 1 6.23 2615.0 872.30
## - p20_datascience 1 48.18 2657.0 895.71
## - p12_workers_number 1 146.81 2755.6 949.33
## - p13_manager 1 150.59 2759.4 951.34
## - p18_time_experience_before 1 160.49 2769.3 956.61
## - p17_time_experience_data_science 1 298.64 2907.4 1028.22
## - p8_degreee_level 1 462.45 3071.2 1108.85
##
## Step: AIC=869.26
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p19_is_data_science_professional + p20_datascience + p21_prog_language +
## p26_databases + p27_bi + p28_etl + p34_extra_study
##
## Df Sum of Sq RSS AIC
## - p27_bi 1 1.05 2610.7 867.86
## - p19_is_data_science_professional 1 1.46 2611.1 868.09
## - p28_etl 1 1.86 2611.5 868.31
## <none> 2609.6 869.26
## - p34_extra_study 1 3.79 2613.4 869.40
## - p26_databases 1 3.98 2613.6 869.51
## - p21_prog_language 1 6.12 2615.7 870.71
## - p20_datascience 1 48.96 2658.6 894.61
## - p12_workers_number 1 146.53 2756.2 947.63
## - p13_manager 1 152.44 2762.1 950.78
## - p18_time_experience_before 1 160.85 2770.5 955.25
## - p17_time_experience_data_science 1 298.47 2908.1 1026.56
## - p8_degreee_level 1 462.58 3072.2 1107.32
##
## Step: AIC=867.86
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p19_is_data_science_professional + p20_datascience + p21_prog_language +
## p26_databases + p28_etl + p34_extra_study
##
## Df Sum of Sq RSS AIC
## - p19_is_data_science_professional 1 0.82 2611.5 866.32
## - p28_etl 1 2.40 2613.1 867.21
## <none> 2610.7 867.86
## - p34_extra_study 1 3.89 2614.6 868.05
## - p26_databases 1 4.68 2615.3 868.49
## - p21_prog_language 1 5.84 2616.5 869.15
## - p20_datascience 1 48.70 2659.4 893.05
## - p12_workers_number 1 149.43 2760.1 947.73
## - p13_manager 1 153.79 2764.4 950.05
## - p18_time_experience_before 1 160.15 2770.8 953.43
## - p17_time_experience_data_science 1 302.66 2913.3 1027.21
## - p8_degreee_level 1 461.63 3072.3 1105.36
##
## Step: AIC=866.32
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p20_datascience + p21_prog_language + p26_databases + p28_etl +
## p34_extra_study
##
## Df Sum of Sq RSS AIC
## - p28_etl 1 1.65 2613.1 865.25
## <none> 2611.5 866.32
## - p34_extra_study 1 4.03 2615.5 866.59
## - p26_databases 1 4.54 2616.0 866.87
## - p21_prog_language 1 12.25 2623.7 871.20
## - p20_datascience 1 48.11 2659.6 891.17
## - p12_workers_number 1 150.93 2762.4 946.97
## - p13_manager 1 156.30 2767.8 949.83
## - p18_time_experience_before 1 163.02 2774.5 953.39
## - p17_time_experience_data_science 1 303.98 2915.5 1026.29
## - p8_degreee_level 1 461.64 3073.1 1103.76
##
## Step: AIC=865.25
## p16_salary_range ~ p8_degreee_level + p12_workers_number + p13_manager +
## p17_time_experience_data_science + p18_time_experience_before +
## p20_datascience + p21_prog_language + p26_databases + p34_extra_study
##
## Df Sum of Sq RSS AIC
## <none> 2613.1 865.25
## - p34_extra_study 1 4.05 2617.2 865.53
## - p26_databases 1 8.06 2621.2 867.78
## - p21_prog_language 1 10.60 2623.7 869.20
## - p20_datascience 1 49.27 2662.4 890.72
## - p12_workers_number 1 150.35 2763.5 945.54
## - p13_manager 1 154.76 2767.9 947.88
## - p18_time_experience_before 1 164.68 2777.8 953.15
## - p17_time_experience_data_science 1 310.52 2923.7 1028.42
## - p8_degreee_level 1 461.98 3075.1 1102.71
summary(m1)
##
## Call:
## lm(formula = p16_salary_range ~ p8_degreee_level + p12_workers_number +
## p13_manager + p17_time_experience_data_science + p18_time_experience_before +
## p20_datascience + p21_prog_language + p26_databases + p34_extra_study,
## data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.1172 -0.9004 -0.0220 0.9277 4.4429
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.18361 0.14606 -1.257 0.2089
## p8_degreee_level 0.77522 0.04824 16.071 < 2e-16 ***
## p12_workers_number 0.15808 0.01724 9.168 < 2e-16 ***
## p13_manager 0.86889 0.09341 9.302 < 2e-16 ***
## p17_time_experience_data_science 0.28408 0.02156 13.176 < 2e-16 ***
## p18_time_experience_before 0.16546 0.01724 9.595 < 2e-16 ***
## p20_datascience 0.07130 0.01359 5.248 1.76e-07 ***
## p21_prog_language -0.08778 0.03605 -2.435 0.0150 *
## p26_databases 0.05735 0.02701 2.123 0.0339 *
## p34_extra_study 0.03899 0.02591 1.505 0.1325
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.337 on 1461 degrees of freedom
## (32 observations deleted due to missingness)
## Multiple R-squared: 0.4973, Adjusted R-squared: 0.4942
## F-statistic: 160.6 on 9 and 1461 DF, p-value: < 2.2e-16
autoplot(m1, which = 1:6)
metricas, proporcao de dados (palavras) utilizadas, tempo de processamento, tempo de estimacao etc
glmnet
grid search
modelo hibrido?
bagging, boosting, blending
“extreme feature engineering”
Contexto Problema Solucao Achados Limitacoes Conclusoes
Shiny?